home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Technology Seed / Mac Tech Seed Feb '97.toast / ODF Release 3 / Developer University / DU Projects / Talker Part / Sources / Content.cpp < prev    next >
Encoding:
Text File  |  1996-12-11  |  6.0 KB  |  205 lines  |  [TEXT/CWIE]

  1. //    Release Version:    $ ODF 3 $
  2. //    Copyright:            (c) 1993 - 1996 by Apple Computer, Inc., all rights reserved.
  3.  
  4. //========================================================================================
  5. #include "Talker.hpp"
  6.  
  7. #ifndef CONTENT_H
  8. #include "Content.h"
  9. #endif
  10.  
  11. #ifndef PART_H
  12. #include "Part.h"
  13. #endif
  14.  
  15. #ifndef FWKIND_H
  16. #include "FWKind.h"
  17. #endif
  18.  
  19. #ifndef SOM_DevUniv_STalker_xh
  20. #include "STalker.xh"            // for STalker
  21. #endif 
  22.  
  23. //========================================================================================
  24. #ifdef FW_BUILD_MAC
  25. #pragma segment Talker
  26. #endif
  27.  
  28. //========================================================================================
  29. const FW_Boolean kWaitUntilDone = TRUE;
  30.  
  31. //========================================================================================
  32. FW_DEFINE_AUTO(CTalkerContent)
  33.  
  34. //----------------------------------------------------------------------------------------
  35. CTalkerContent::CTalkerContent(Environment* ev, CTalkerPart* part) :
  36.     FW_CContent(ev, part),
  37.     fTextBuffer(NULL),
  38.     fTextBytes(0),
  39.     fTalkerPart(part),
  40.     fSOMTalker(NULL)
  41. {
  42.     fSOMTalker = new DevUniv_STalker;    
  43.     fSOMTalker->SayString(ev, "ODF", !kWaitUntilDone);        // say it!
  44.     fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);
  45.  
  46.     FW_END_CONSTRUCTOR
  47. }
  48.  
  49. //----------------------------------------------------------------------------------------
  50. CTalkerContent::~CTalkerContent()
  51. {
  52.     FW_START_DESTRUCTOR
  53.     delete fSOMTalker;
  54.     FW_CMemoryManager::FreeBlock(fTextBuffer);
  55. }
  56.  
  57. //----------------------------------------------------------------------------------------
  58. void 
  59. CTalkerContent::ExternalizeKind(Environment* ev,
  60.                                 ODStorageUnit* storageUnit,
  61.                                 FW_CKind* kind,
  62.                                 FW_StorageKinds storageKind,
  63.                                 FW_CPromise* promise,
  64.                                 FW_CCloneInfo* cloneInfo)
  65. {
  66.     FW_UNUSED(cloneInfo);
  67.     FW_UNUSED(storageKind);
  68.     FW_UNUSED(promise);
  69.  
  70.     FW_PStorageUnitSink suSink(ev, storageUnit, kODPropContents, kind->GetType(ev));
  71.     FW_CWritableStream stream(suSink);
  72.     if (kind->IsPartKind(ev)) {
  73.         stream << fTextBytes;
  74.         stream.Write(fTextBuffer, fTextBytes);
  75.  
  76.         FW_CPicture picture = this->MyGetPicture(ev);
  77.         stream << picture;
  78.         }
  79. }
  80.  
  81. //----------------------------------------------------------------------------------------
  82. FW_Boolean 
  83. CTalkerContent::InternalizeKind(Environment* ev,
  84.                                 ODStorageUnit* sourceSU, 
  85.                                 FW_CKind* kind,
  86.                                 FW_StorageKinds storageKind,
  87.                                 FW_CCloneInfo* cloneInfo)
  88. {
  89.     FW_UNUSED(cloneInfo);
  90.     FW_UNUSED(storageKind);
  91.     FW_Boolean internalized = false;
  92.     if (kind->IsPartKind(ev))
  93.         internalized = this->MyInternalizePartKind(ev, sourceSU, kind->GetType(ev));
  94.  
  95.     else if (kind->IsEqual(ev, 'TEXT', kODPlatformDataType))
  96.         internalized = this->MyInternalizeTEXTData(ev, sourceSU, kind->GetType(ev));
  97.  
  98.     else if (kind->IsEqual(ev, 'PICT', kODPlatformDataType))
  99.         internalized = this->MyInternalizePICTData(ev, sourceSU, kind->GetType(ev));
  100.  
  101.     if (internalized && storageKind != FW_kPartStorage) {
  102.         const FW_Boolean kInvalidateOnly = true;
  103.         fTalkerPart->PartChanged(ev, ! kInvalidateOnly);
  104.         }
  105.     return internalized;
  106. }
  107.  
  108. //----------------------------------------------------------------------------------------
  109. FW_Boolean 
  110. CTalkerContent::MyInternalizePartKind(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
  111. {
  112.     FW_Boolean internalized = false;
  113.     FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
  114.     if (suSink->GetReadableBytes(ev) != 0) {
  115.         FW_CReadableStream stream(suSink);
  116.         stream >> fTextBytes;
  117.         FW_CMemoryManager::FreeBlock(fTextBuffer);
  118.         fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);    
  119.         stream.Read(fTextBuffer, fTextBytes);
  120.  
  121.         stream >> fPicture;
  122.  
  123.         internalized = true;
  124.         }
  125.     return internalized;
  126. }
  127.  
  128. //----------------------------------------------------------------------------------------
  129. FW_Boolean 
  130. CTalkerContent::MyInternalizeTEXTData(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
  131. {
  132.     FW_Boolean internalized = false;
  133.     FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
  134.     ODULong bytes = suSink->GetReadableBytes(ev);
  135.     if (bytes >= 0) {
  136.         FW_CReadableStream stream(suSink);
  137.         fTextBytes = bytes;
  138.         FW_CMemoryManager::FreeBlock(fTextBuffer);
  139.         fTextBuffer = FW_CMemoryManager::AllocateBlock(fTextBytes);    
  140.         stream.Read(fTextBuffer, fTextBytes);
  141.         internalized = true;
  142.         this->MySayText(ev);
  143.         }
  144.     return internalized;
  145. }
  146.  
  147. //----------------------------------------------------------------------------------------
  148. FW_Boolean 
  149. CTalkerContent::MyInternalizePICTData(Environment* ev, ODStorageUnit* sourceSU, ODType valueType)
  150. {
  151.     FW_Boolean internalized = false;
  152.     FW_PStorageUnitSink suSink(ev, sourceSU, kODPropContents, valueType);
  153.     ODULong bytes = sourceSU->GetSize(ev);
  154.     if (bytes >= 0) {
  155.         FW_PBufferedSink sink(ev, suSink);
  156.         FW_CReadableStream stream(sink);
  157.         FW_PlatformHandle h = 
  158.                     FW_CMemoryManager::AllocateSystemHandle(bytes);
  159.         FW_CMemoryManager::LockSystemHandle(h);
  160.         stream.Read(*h, bytes);
  161.         FW_CMemoryManager::UnlockSystemHandle(h);
  162.         fPicture.AdoptPlatformPict((FW_PlatformPict)h);
  163.         internalized = true;
  164.         }
  165.     return internalized;
  166. }
  167.  
  168. //----------------------------------------------------------------------------------------
  169. void 
  170. CTalkerContent::MySayText(Environment* ev)
  171. {    
  172.     fSOMTalker->SayText(ev, (char*)fTextBuffer, fTextBytes, !kWaitUntilDone);    // say it!
  173. }
  174.  
  175. //----------------------------------------------------------------------------------------
  176. DevUniv_STalker*
  177. CTalkerContent::MyGetTalker()
  178. {
  179.     return fSOMTalker;
  180. }
  181.  
  182. //----------------------------------------------------------------------------------------
  183. FW_CPicture
  184. CTalkerContent::MyGetPicture(Environment* ev)
  185. {
  186.     if ((const void*)fPicture == NULL)
  187.     {
  188.         // Fool the compiler so we can do caching
  189.         CTalkerContent* self = (CTalkerContent*)this;
  190.         self->MyUseDefaultPicture(ev);
  191.     }
  192.     
  193.     return fPicture;
  194. }
  195.  
  196. //----------------------------------------------------------------------------------------
  197. void
  198. CTalkerContent::MyUseDefaultPicture(Environment* ev)
  199. {
  200.     FW_PSharedLibraryResourceFile resFile(ev);            // PICT resource in shared library
  201.     const short kPizzaPictID = 2000;    
  202.     FW_CPicture pic(resFile, kPizzaPictID);
  203.     fPicture = pic;
  204. }
  205.